{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 构造数据\n",
    "X = np.array([\n",
    "    [5, 1],\n",
    "    [4, 2],\n",
    "    [2, 5],\n",
    "    [1, 4],\n",
    "    [3, 2],\n",
    "    [2, 5]\n",
    "])\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "k=1\n",
    "# 2. 创建 KNN 模型\n",
    "knn = KNeighborsClassifier(n_neighbors=k)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 3. 训练模型\n",
    "knn.fit(X, y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测的类别: 1\n"
     ]
    }
   ],
   "source": [
    "# 4. 用模型推理(预测)用户的喜好\n",
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)\n",
    "print(\"预测的类别:\", prediction[0])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 5. 数据可视化\n",
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，使用不同颜色标记不同类别\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', label='Existing Users')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], marker='x', color='red', markersize=8, label='New User')\n",
    "\n",
    "# 最近邻查找\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]]  # 获取最近邻点坐标\n",
    "\n",
    "# 用红色虚线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x_val, y_val in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x_val, y_val+0.1, f'({x_val}, {y_val})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0, 0], new_user[0, 1]+0.1, f'({new_user[0, 0]}, {new_user[0, 1]})')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
